package com.jahe.learn.nio.join;

import java.util.logging.Logger;

/**
 * 演示异步阻塞方法Join的使用
 * 泡茶的示例 （烧水，清洗待流程）
 * <b>join有一个问题：被合并的线程没有返回值。例如，在烧水的实例中，如果烧水线程的执行结束，main线程是无法知道结果的。</b>
 * @author: jahe.lai
 * @create: 2019-12-24 17:13
 */
public class UseJoinMakeTea {

    public static final int SLEEP_GAP = 500;

    public static String getCurrentThreadName() {
        return Thread.currentThread().getName();
    }

    static class HotWaterThread extends Thread {

        public HotWaterThread() {
            super("HotWater-thread ");
        }

        @Override
        public void run() {
            try {
                pt("洗好水壶");
                pt("加进凉水");
                pt("放在炎上");

                Thread.sleep(SLEEP_GAP);
                pt("水开了");

            } catch (Exception e) {
                e.printStackTrace();
            }
            pt("浇水结束。。。");
        }
    }

    static class WashThread extends Thread {
        public WashThread () {
            super("Wash-thread ");
        }

        @Override
        public void run() {
            try {
                pt("洗茶壶");
                pt("洗茶杯");
                pt("选茶叶");

                Thread.sleep(SLEEP_GAP);
                pt("洗刷完成。。。");

            } catch (Exception e) {
                e.printStackTrace();
            }
            pt("洗刷结束。。。");
        }
    }

    public static void main(String[] args) {
        Thread hotT = new HotWaterThread();
        Thread washT = new WashThread();
        hotT.start();
        washT.start();
        try {
            // 合并 烧水线程
            hotT.join();
            // 合并清洁线程
            washT.join();

            Thread.currentThread().setName("** 主线程");
            pt("泡茶喝");
        } catch (Exception e) {
            e.printStackTrace();
        }
        pt("结束。。。");

    }

    private static void pt(String msg) {
        System.out.println(getCurrentThreadName() + " : " + msg);
    }
}
